/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Dao;

import Dto.ProductoDTO;
import Modelo.Conexion;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


/**
 *
 * @author -ADMIN-
 */
public class ProductoDAO {
    public static Connection con = Conexion.getInstance();
    public  static PreparedStatement pstm;
    public static CallableStatement cstm;
    public static ResultSet rs;
    
    public static synchronized int registrarProducto(){
        return 0;
    }
    
    public static synchronized ArrayList<ProductoDTO> listarProductos(){
        
        //El array que contendra todos nuestros productos
        ArrayList<ProductoDTO> lista = new ArrayList<>();
        String call = "{CALL sp_listarTodosProductos()}";
        try {
            cstm = con.prepareCall(call);
            // cstm.registerOutParameter(1, java.sql.Types.VARCHAR);
            // cstm.registerOutParameter(2, java.sql.Types.VARCHAR);
            rs = cstm.executeQuery();
            while (rs.next()) {                
                // producto
                int idP = rs.getInt("idProductos");
                String namePro = rs.getString("NombreProducto");
                String descriP = rs.getString("Descripcion");
                double precio = rs.getDouble("Precio");
                int exist = rs.getInt("existencias");
                
                // catalogo 
               //  String nombreC = cstm.getString(1);
                // String descripC = cstm.getString(2);
                
                // CatalogoDTO cdto = new CatalogoDTO(nombreC, descripC);
                ProductoDTO pdto = new ProductoDTO(idP, namePro, descriP, precio, exist);
                lista.add(pdto);
            }
            
        } catch (SQLException ex) {
            throw new RuntimeException(" error al listar todos los productos: "+ex);
        }
        
       return lista;
    }
    
    public static synchronized ArrayList<ProductoDTO> listarProductos(String catalogo){
        
        //El array que contendra todos nuestros productos
        ArrayList<ProductoDTO> lista = new ArrayList<>();
        String call = "{CALL sp_listarProductoCatalogo( ?)}";
        try {
            cstm = con.prepareCall(call);
            cstm.setString(1, catalogo);
            rs = cstm.executeQuery();
            while (rs.next()) {                
                int idP = rs.getInt("idProductos");
                String namePro = rs.getString("NombreProducto");
                String descriP = rs.getString("Descripcion");
                double precio = rs.getDouble("Precio");
                int exist = rs.getInt("existencias");                
                lista.add( new ProductoDTO(idP, namePro, descriP, precio, exist));
            }
            
        } catch (SQLException ex) {
            throw new RuntimeException(" error al listar todos los productos: "+ex);
        }
        
       return lista;
    }
    
    public static synchronized ProductoDTO consultarProducto(int idProducto){
        ProductoDTO pdto = new ProductoDTO();
        
        String call = "CALL sp_consultarProductoById(?)";
        try {
            cstm = con.prepareCall(call);
            cstm.setInt(1, idProducto);
            rs = cstm.executeQuery();
            
            if(rs != null){
                while(rs.next()){
                    //pdto = new ProductoDTO(idProducto,rs.getString("Descripcion"), rs.getDouble("Precio"), rs.getInt("existencias"));
                    pdto.setIdProducto(idProducto);
                    pdto.setNombreProducto(rs.getString("NombreProducto"));
                    pdto.setDescripcion(rs.getString("Descripcion"));
                    pdto.setPrecio(rs.getDouble("Precio"));
                    pdto.setExistencias(rs.getInt("existencias"));
                }
            }
        } catch (SQLException ex) {
            throw new RuntimeException("error al consultar el usuario: "+ex);
        }
        return pdto;
    }
    
    public static synchronized boolean eliminarProducto(int id ){
        boolean resultado = false;
        String delete = "delete from Productos where idProductos = ?";
        try{
              pstm= con.prepareStatement(delete);
              pstm.setInt(1, id);
              
              if(pstm.executeUpdate() > 0)
                  resultado = true;
                           
          }catch(SQLException sqe){
              throw new RuntimeException("error: "+sqe.getSQLState()+" = "+sqe.getMessage());
          }
        return resultado;
     }
    
     public static synchronized boolean updateProducto(){
         return false;
     }
    
    
    
}
